#ifndef DICTIONARY_H_
#define DICTIONARY_H_

#include "Word.h"
#include <thrust/host_vector.h>
#include <thrust/device_vector.h>
#include <cmath>
#include <map>

using thrust::host_vector;
using thrust::device_vector;

/*
 * =====================================================================================
 *       Struct:  CudaDictionary
 *  Description:  Estrutura Dictionary para manipulação no CUDA
 * =====================================================================================
 */
typedef struct
{
	WordPair* words;  // Ponteiro para as palavras
	uint size;		  // Quantidade de palavras
	uint* hits;		  // Número de palavras encontradas
} CudaDictionary;

/*
 * =====================================================================================
 *        Class:  Dictionary
 *  Description:  Classe que representa um conjunto de palavras
 * =====================================================================================
 */
class Dictionary
{

public:

    /*-----------------------------------------------------------------------------
     *  Constrói um dicionário
     *-----------------------------------------------------------------------------*/
    Dictionary();

    /*-----------------------------------------------------------------------------
     *  Adiciona uma palavra
     *-----------------------------------------------------------------------------*/
    void add(const string &word);

    /*-----------------------------------------------------------------------------
     *  Adiciona uma palavra
     *-----------------------------------------------------------------------------*/
    void put(string word);

    /*-----------------------------------------------------------------------------
     *  Preenche todas as palavras em um vetor
     *-----------------------------------------------------------------------------*/
    void fill(host_vector<WordPair> &vector);

    /*-----------------------------------------------------------------------------
     *  Tabela associando um booleano à uma palavra
     *-----------------------------------------------------------------------------*/
    map<string, bool> words;

    /*-----------------------------------------------------------------------------
     *  Quantidade de palavras para cada tamanho
     *-----------------------------------------------------------------------------*/
    uint howmany[_WD_SIZE + 1];

    /*-----------------------------------------------------------------------------
     *  Quantidade total de palavras
     *-----------------------------------------------------------------------------*/
    uint count;

    /*-----------------------------------------------------------------------------
     *  Imprime as palavras encontradas
     *-----------------------------------------------------------------------------*/
    friend ostream& operator <<(ostream &os, const Dictionary &words);

};

#endif
